﻿using Excel;
using System;
using System.Data;
using System.IO;
using System.Linq;

namespace ExcelToMySQL
{
    class Program
    {
        static void Main(string[] args)
        {
            //TODO проверка аргументов
            //TODO набор задач (разбить по четыре аргуемнта и выполнять последовательно)
            try
            {
                var filePath = args[0];//название файла xlsx
                var workSheet = args[1];//название листа

                var conStrAnalysis = args[2];//строка подключения к аналитической БД
                var cmdTxtAnalysis = args[3];//команда запроса к аналитической БД

                using (var adapter = new MySql.Data.MySqlClient.MySqlDataAdapter(cmdTxtAnalysis, conStrAnalysis))
                {
                    //команды для адаптера
                    var builder = new MySql.Data.MySqlClient.MySqlCommandBuilder(adapter);
                    adapter.InsertCommand = builder.GetInsertCommand();
                    adapter.UpdateCommand = builder.GetUpdateCommand();
                    adapter.DeleteCommand = builder.GetDeleteCommand();
                    builder = null;

                    //таблица для синхронизации
                    var dtAnalysis = new DataTable();
                    Console.WriteLine("{0}: получение таблицы из {1}", DateTime.Now, adapter.SelectCommand.Connection.Database);
                    adapter.Fill(dtAnalysis);
                    Console.WriteLine("{0}: успешно", DateTime.Now);

                    //очистить таблицу
                    foreach (var row in dtAnalysis.AsEnumerable().ToArray())
                    {
                        row.Delete();
                    }

                    using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read))
                    {
                        using (var reader = ExcelReaderFactory.CreateOpenXmlReader(stream))
                        {
                            reader.IsFirstRowAsColumnNames = true;

                            //заполнить строками из оперативной БД
                            Console.WriteLine("{0}: получение данных из {1}", DateTime.Now, Path.GetFileName(filePath));
                            reader.AsDataSet().Tables[workSheet].AsEnumerable().CopyToDataTable(dtAnalysis, LoadOption.Upsert);

                            //dtAnalysis.Load(reader, LoadOption.Upsert);
                            Console.WriteLine("{0}: успешно", DateTime.Now);
                        }
                    }

                    //сохранить в аналитической БД
                    Console.WriteLine("{0}: запись данных в {1}", DateTime.Now, adapter.SelectCommand.Connection.Database);
                    adapter.Update(dtAnalysis);
                    Console.WriteLine("{0}: успешно", DateTime.Now);

                    dtAnalysis = null;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("{0}: ошибка: {1}", DateTime.Now, ex.Message);
            }
            finally
            {
                Console.WriteLine("{0}: нажмите любую клавишу...", DateTime.Now);
                Console.ReadKey();
            }
        }
    }
}
